﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using CTEM.Controllers.BUS;
using CTEM.Models;
using DevExpress.XtraBars;
using DevExpress.XtraEditors;
using DevExpress.XtraEditors.Controls;
using DevExpress.XtraEditors.DXErrorProvider;
using DevExpress.XtraGrid;
using DevExpress.XtraGrid.Views.Base;
using CTEM.Controllers.Global;

namespace CTEM.ModuleForms.ManageLedger
{
    public partial class SpendTypeManagement : DevExpress.XtraBars.Ribbon.RibbonForm
    {
        private readonly LedgerBUS _ledgerBus = new LedgerBUS();
        private static List<SendTypeDTO> _listSpendType = new List<SendTypeDTO>();
        private bool _isNew;
        private bool _isUpdate;
        private bool _isEdit;

        public SpendTypeManagement()
        {
            InitializeComponent();
            _isNew = false;
            _isUpdate = false;
            
            LoadSpendType();
        }
        
        private void LoadSpendType()
        {
            _listSpendType = _ledgerBus.LoadSendType();
            sendTypeDTOBindingSource.DataSource = _listSpendType;
        }

        private static bool ValidateSendType(SendTypeDTO spendType, out string output, out int i)
        {
            i = 0;
            if (String.IsNullOrEmpty(spendType.SpendTypeName))
            {
                output = "Xin hãy nhập Tên Loại Chi";
                i = 0;
                return false;
            }
            foreach (var spendtypeDto in _listSpendType)
            {
                if (!spendtypeDto.SpendTypeName.ToUpper().Trim().Equals(spendType.SpendTypeName.ToUpper().Trim())
                    || spendtypeDto.SpendTypeID.CompareTo(spendType.SpendTypeID) == 0) continue;
                {
                    output =
                        string.Format(
                            "Tên loại chi \"{0}\" mà bạn khởi tạo đã tồn tại.\n Vui lòng thử lại với tên khác.",
                            spendType.SpendTypeName);
                    i = 0;
                    return false;
                }
            }
            output = "";
            return true;
        }

        private void gridView1_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
        {
            if (!_isNew)
            {
                var view = sender as ColumnView;
                var i = e.RowHandle;
                var spendType = gridView1.GetRow(i) as SendTypeDTO;
                if (spendType != null)
                {
                    var message = "";
                    var pos = -1;
                    if (!ValidateSendType(spendType, out message, out pos))
                    {
                        DialogResult result = MessageBox.Show(message + "\nBạn có muốn nhập lại thông tin", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                        if (view != null)
                        {
                            view.SetColumnError(view.Columns[pos], message, ErrorType.Warning);
                            if (result == DialogResult.No)
                            {
                                _isUpdate = false;
                                view.ClearColumnErrors();
                                LoadSpendType();
                                return;
                            }
                            else
                            {
                                _isUpdate = true;
                                gridView1.FocusedRowHandle = i;
                                gridView1.FocusedColumn = e.Column;
                                return;
                            }
                        }
                    }
                    if (!_ledgerBus.UpdateSpendType(spendType))
                    {
                        MessageBox.Show("Không thể cập nhật thông tin loại chi", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        _isUpdate = false;
                        LoadSpendType();
                    }
                    else
                    {
                        alertControlMain.Show(this, Constants.CONFIRM, String.Format("Bạn Đã chỉnh sửa loại chi {0} Thành Công!", spendType.SpendTypeName));
                        _isUpdate = false;
                        LoadSpendType();
                    }
                }
            }
        }

        private void gridView1_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
        {
            if (e.FocusedRowHandle == DevExpress.XtraGrid.GridControl.NewItemRowHandle)
            {
                 gridView1.OptionsBehavior.ReadOnly = false;
                if (_isNew)
                    gridView1.FocusedRowHandle = GridControl.NewItemRowHandle;
             }
            else
            {
                gridView1.OptionsBehavior.ReadOnly = !_isEdit;
                if (_isUpdate)
                {
                   
                    _isUpdate = false;
                    LoadSpendType();
                }
            }
        }

        private void gridView1_InitNewRow(object sender, DevExpress.XtraGrid.Views.Grid.InitNewRowEventArgs e)
        {
            _isNew = true;
        }

        private void gridView1_ValidateRow(object sender, DevExpress.XtraGrid.Views.Base.ValidateRowEventArgs e)
        {

            if (_isNew)
            {
                var view = sender as ColumnView;
                var spendType = e.Row as SendTypeDTO;
                    String message = null;
                    int pos = -1;
                    if (!ValidateSendType(spendType, out message, out pos))
                    {
                        e.Valid = false;
                        if (view != null)
                        {
                            view.ClearColumnErrors();
                            view.SetColumnError(view.Columns[pos], message, ErrorType.Warning);
                        }
                        DialogResult result = MessageBox.Show(message + "\nBạn có muốn nhập lại thông tin", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                        if (result == DialogResult.No)
                        {
                            _isNew = false;
                            e.Valid = true;
                            LoadSpendType();
                        }
                    }
                    else
                    {
                       long success = _ledgerBus.CreateSpendType(spendType);
                        if (success == 0)
                        {
                            e.Valid = false;
                            LoadSpendType();
                        }
                        else
                        {
                            alertControlMain.Show(this, Constants.CONFIRM, String.Format("Bạn Đã tạo mới loại chi {0} Thành Công!", spendType.SpendTypeName));
                           _isNew = false;
                            LoadSpendType();
                        }
                    }
                

            }
        }

        private void gridView1_InvalidRowException(object sender, DevExpress.XtraGrid.Views.Base.InvalidRowExceptionEventArgs e)
        {
            e.ExceptionMode = ExceptionMode.NoAction;
        }

        private void btnDelete_ItemClick(object sender, ItemClickEventArgs e)
        {
            int rowIndex = gridView1.FocusedRowHandle;
            var spendType = gridView1.GetRow(rowIndex) as SendTypeDTO;
            if (spendType != null)
                if (MessageBox.Show(string.Format("Bạn có chắc chắn muốn xóa Loại chi \"{0}\" không?", spendType.SpendTypeName), "Cảnh báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                {
                    LedgerBUS lergerBUS = new LedgerBUS();
                    if (!lergerBUS.loadLergerByKind(spendType.SpendTypeID))
                    {
                        bool success = _ledgerBus.DeleteSpendType((spendType));
                        if (success)
                        {
                            alertControlMain.Show(this, Constants.CONFIRM, String.Format("Bạn Đã xóa loại chi {0} Thành Công!", spendType.SpendTypeName));
                           
                        }
                        else
                            MessageBox.Show("Không thể xóa Loại Chi này.", "Cảnh báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    }
                    else 
                    {
                        MessageBox.Show("Không thể xóa Loại Chi này.\n Có phiếu chi đang sử dụng loại chi này,\n bạn muốn xóa thì phải xóa hoặc sửa phiếu chi trước", "Cảnh báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    }
                }
            LoadSpendType();
        }

        private void bntEdit_ItemClick(object sender, ItemClickEventArgs e)
        {
            gridView1.OptionsBehavior.ReadOnly = false ;
        }

        private void SpendTypeManagement_Load(object sender, EventArgs e)
        {
           _isEdit = false;
        }

       


    }
}